fknittel / pba Goto Github PK
View Code? Open in Web Editor NEWA simple tennis court irrigation controller
A simple tennis court irrigation controller
Viele neue Features sind verfuegbar und sollten in die einzig wahre Installation depolyt werden.
Hiho
kannst du einmal kurz die eine eingabezeile auf 4-6 eingabezeilen aufblähen und jeweils den court vorne schon eintragen? Dann brauch ich nicht immer so nervig "court4" eintragen ... mein handy besteht auch immer noch auf ein großes C am anfang :-D
wird hier geplant
Wurde das jetzt schonmal "richtig" benutzt? Wenn ja, welche Erfahrungen gibt es?
Hiho
Ich fände ein paar sekunden delay zwischen abschalten des einen und anschalten des nächsten Platzes noch gut.
Neuer Beitrag aus der Abteilung Requirements Engineering: Schiebregler.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="./libs/bootstrap/css/bootstrap.min.css">
<script type="text/javascript">
//<![CDATA[
function anzeigen(das) {
if (document.getElementById(das).style.display=='none')
document.getElementById(das).style.display='block';
else
document.getElementById(das).style.display='none';
}
//]]>
</script>
<title>PBA Idiot Mode Mockup</title>
<style type="text/css">
.progress.vertical {
position: relative;
width: 20px;
min-height: 240px;
float: left;
margin-right: 20px;
background: none;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
border: none;
}
.table td {
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<div class="">
<h2>Ziehe, um den Platz nass zu machen:</h2>
<div class="alert alert-info">
<table>
<tr>
<td class="span4" style="text-align: center">
<h2>Platz 1</h2>
</td>
<td class="span4" style="text-align: center">
<h2>Platz 2</h2>
</td>
<td class="span4" style="text-align: center">
<h2>Platz 3</h2>
</td>
<td class="span4" style="text-align: center">
<h2>Platz 4</h2>
</td>
<td class="span4" style="text-align: center">
<h2>Platz 5</h2>
</td>
<td class="span4" style="text-align: center">
<h2>Platz 6</h2>
</td>
</tr>
<tr>
<td class="span4">
<table >
<tr>
<td width="30%">
</td>
<td width="30%">
<div class="progress vertical" style="width: 50px;">
<div class="bar bar-success" style="height: 0%;width:60%"></div>
<div class="bar bar-default" style="height: 20%;width:100%">aus</div>
<div class="bar bar-warning" style="height: 80%;width:60%"></div>
</div>
</td>
<td width="30%">
<br>
aus
<br><br>
1min
<br><br>
2min
<br><br>
3min
<br><br>
4min
<br><br>
5min
</td>
</tr>
</table>
</td>
<td class="span4">
<table>
<tr>
<td width="30%">
</td>
<td width="30%">
<div class="progress vertical" style="width: 50px;">
<div class="bar bar-success" style="height: 80%;width:60%"></div>
<div class="bar bar-default" style="height: 20%;width:100%">4:58</div>
<div class="bar bar-warning" style="height: 0%;width:60%"></div>
</div>
</td>
<td width="30%">
<br>
aus
<br><br>
1min
<br><br>
2min
<br><br>
3min
<br><br>
4min
<br><br>
5min
</td>
</tr>
</table>
</td>
<td class="span4">
<table>
<tr>
<td width="30%">
</td>
<td width="30%">
<div class="progress vertical" style="width: 50px;">
<div class="bar bar-success" style="height: 0%;width:60%"></div>
<div class="bar bar-default" style="height: 20%;width:100%">aus</div>
<div class="bar bar-warning" style="height: 80%;width:60%"></div>
</div>
</td>
<td width="30%">
<br>
aus
<br><br>
1min
<br><br>
2min
<br><br>
3min
<br><br>
4min
<br><br>
5min
</td>
</tr>
</table>
</td>
<td class="span4">
<table>
<tr>
<td width="30%">
</td>
<td width="30%">
<div class="progress vertical" style="width: 50px;">
<div class="bar bar-success" style="height: 50%;width:60%"></div>
<div class="bar bar-default" style="height: 20%;width:100%">2:10</div>
<div class="bar bar-warning" style="height: 30%;width:60%"></div>
</div>
</td>
<td width="30%">
<br>
aus
<br><br>
1min
<br><br>
2min
<br><br>
3min
<br><br>
4min
<br><br>
5min
</td>
</tr>
</table>
</td>
<td class="span4">
<table>
<tr>
<td width="30%">
</td>
<td width="30%">
<div class="progress vertical" style="width: 50px;">
<div class="bar bar-warning" style="height: 60%;width:60%"></div>
<div class="bar bar-default" style="height: 20%;width:100%">startet in 2:10</div>
<div class="bar bar-warning" style="height: 20%;width:60%"></div>
</div>
</td>
<td width="30%">
<br>
aus
<br><br>
1min
<br><br>
2min
<br><br>
3min
<br><br>
4min
<br><br>
5min
</td>
</tr>
</table>
</td>
<td class="span4">
<table>
<tr>
<td width="30%">
</td>
<td width="30%">
<div class="progress vertical" style="width: 50px;">
<div class="bar bar-success" style="height: 0%;width:60%"></div>
<div class="bar bar-default" style="height: 20%;width:100%">aus</div>
<div class="bar bar-warning" style="height: 80%;width:60%"></div>
</div>
</td>
<td width="30%">
<br>
aus
<br><br>
1min
<br><br>
2min
<br><br>
3min
<br><br>
4min
<br><br>
5min
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</div>
<div class="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
Die blauen "Dinger" sind vertikale Schiebregler. Durch Ziehen nach unten wird das Wässern gestartet.
Während dem Wässern läuft der Regler langsam nach oben. Nach oben Schieben bricht Bewässerung ab.
</div>
<div class="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
Auf dem blauen Button steht die exakte Restzeit. Alle Timer zählen in Echtzeit herunter.
</div>
<div class="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
Platz 5 wartet, weil bereits zwei andere Sprenger laufen, der Button zeigt die Restwartezeit (wegen Platz 4).
</div>
<div class="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
Zu evaluieren: Minuten-Anzahl auf (statt neben) den Schiebreglern.
</div>
</div>
</body>
</html>
wird hier geplant
Abteilung "Requirements Engineering" bestehend aus Michael, Daniel und Jelena ist mit dem folgenden Mockup aufgekreuzt. Dies soll umgesetzt oder totdiskutiert werden.
Code dazu:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="./libs/bootstrap/css/bootstrap.min.css">
<script type="text/javascript">
//<![CDATA[
function anzeigen(das) {
if (document.getElementById(das).style.display=='none')
document.getElementById(das).style.display='block';
else
document.getElementById(das).style.display='none';
}
//]]>
</script>
<title>PBA Idiot Mode Mockup</title>
</head>
<body>
<div class="container">
<div class="">
<h2>Klicke, um den Platz nass zu machen:</h2>
<div class="alert alert-info">
<table>
<tr>
<td class="span4">
<div style="display: block; width: 80%;" type="button" class="btn btn-large btn-success disabled">
Platz 1
<br />
Bewässerung gesperrt
<br />
<br />
<!-- <div style="display: block; width: 80%;" type="button" class="btn btn-large btn-success"> -->
---
<!-- </div> -->
<br />
</div>
</td>
<td class="span4">
<div style="display: block; width: 80%;" type="button" class="btn btn-large btn-success">
Platz 2
<br />
Sprinkler inaktiv
<br />
<br />
<!-- <div style="display: block; width: 80%;" type="button" class="btn btn-large btn-success"> -->
1 Minute wässern
<!-- </div> -->
<br />
</div>
</td>
<td class="span4">
<div style="display: block; width: 80%;" type="button" class="btn btn-large btn-info">
<div style="width: 5%;" type="button" class="pull-right btn btn-large btn-warning">
X
</div>
Platz 3
<br />
Sprinkler aktiv für 1:58
<br />
<br />
<!-- <div style="display: block; width: 80%;" type="button" class="btn btn-large btn-success"> -->
1 Minute wässern
<!-- </div> -->
<br />
</div>
</td>
</tr>
<tr>
<td>
</td>
</tr>
<tr>
<td class="span4">
<div style="display: block; width: 80%;" type="button" class="btn btn-large">
<div style="width: 5%;" type="button" class="pull-right btn btn-large btn-warning">
X
</div>
Platz 4
<br />
Sprinkler soll 2:00
<br />(#3 - Wartezeit: 1:58)
<br />
<!-- <div style="display: block; width: 80%;" type="button" class="btn btn-large btn-success"> -->
1 Minute wässern
<!-- </div> -->
<br />
</div>
</td>
<td class="span4">
<div style="display: block; width: 80%;" type="button" class="btn btn-large btn-info">
<div style="width: 5%;" type="button" class="pull-right btn btn-large btn-warning">
X
</div>
Platz 5
<br />
Sprinkler aktiv für 2:43
<br />
<br />
<!-- <div style="display: block; width: 80%;" type="button" class="btn btn-large btn-success"> -->
1 Minute wässern
<!-- </div> -->
<br />
</div>
</td>
<td class="span4">
<div style="display: block; width: 80%;" type="button" class="btn btn-large btn-success">
Platz 6
<br />
Sprinkler inaktiv
<br />
<br />
<!-- <div style="display: block; width: 80%;" type="button" class="btn btn-large btn-success"> -->
1 Minute wässern
<!-- </div> -->
<br />
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
Klick auf den Button fügt eine Zeiteinheit hinzu und lässt den X-Knopf erscheinen.
<br />Wenn "blau": Zeit wird erhöht, Queue-Position bleibt, es wird durchgewässert.
<br />Wenn "grau": Zeit wird erhöht, Queue-Position bleibt.
<br />Wenn "grün": Zeit wird erhöht, Job kommt ans Ende der Queue.
</div>
<div class="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
X-Knopf bricht Bewässerung ab und passt die Queue an.
</div>
<div class="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
Alle Timer zählen in Echtzeit herunter.
</div>
<div class="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
Plätze können gesperrt sein / Bewässerung per PBA nicht gestattet (siehe Platz 1).
</div>
</div>
</body>
</html>
ich habe mir nicht allzuviel muehe gegeben, aber soweit bin ich gekommen.
dann kam ein boeser fehler und hat mich geaergert:
nailor@needle:~1$ cd /tmp
nailor@needle:/tmp$ git clone [email protected]:fknittel/pba.git
Cloning into 'pba'...
remote: Counting objects: 184, done.
remote: Compressing objects: 100% (100/100), done.
remote: Total 184 (delta 82), reused 174 (delta 74)
Receiving objects: 100% (184/184), 141.94 KiB, done.
Resolving deltas: 100% (82/82), done.
nailor@needle:/tmp$ cd pa
cd: no such file or directory: pa
nailor@needle:/tmp1$ cd pba
nailor@needle:/tmp/pba$ ls
src gpio-example.conf irrigationcontroller-setup.service test-example.conf
wwwroot irrigationcontroller.service README.md
nailor@needle:/tmp/pba$ cat README.md
pba ("Platz-Beregnungs-Anlage")
===============================
A simple tennis court irrigation controller.
Start the daemon from the base directory:
$ twistd -no irrigationcontroller -c test-example.conf
nailor@needle:/tmp/pba$ twistd -no irrigationcontroller -c test-example.conf
Usage: twistd [options]
Options:
--savestats save the Stats object rather than the text output of the
profiler.
-o, --no_save do not save state on shutdown
-e, --encrypted The specified tap/aos file is encrypted.
-n, --nodaemon don't daemonize, don't use default umask of 0077
--originalname Don't try to change the process name
--syslog Log to syslog, not to file
--euid Set only effective user-id rather than real user-id.
(This option has no effect unless the server is running
as root, in which case it means not to shed all
privileges after binding ports, retaining the option to
regain privileges in cases such as spawning processes.
Use with caution.)
-l, --logfile= log to a specified file, - for stdout
--logger= A fully-qualified name to a log observer factory to use
for the initial log observer. Takes precedence over
--logfile and --syslog (when available).
-p, --profile= Run in profile mode, dumping results to specified file
--profiler= Name of the profiler to use (profile, cprofile, hotshot).
[default: hotshot]
-f, --file= read the given .tap file [default: twistd.tap]
-y, --python= read an application from within a Python file (implies
-o)
-s, --source= Read an application from a .tas file (AOT format).
-d, --rundir= Change to a supplied directory before running [default:
.]
--prefix= use the given prefix when syslogging [default: twisted]
--pidfile= Name of the pidfile [default: twistd.pid]
--chroot= Chroot to a supplied directory before running
-u, --uid= The uid to run as.
-g, --gid= The gid to run as.
--umask= The (octal) file creation mask to apply.
--help-reactors Display a list of possibly available reactor names.
--version Print version information and exit.
--spew Print an insanely verbose log of everything that happens.
Useful when debugging freezes or locks in complex code.
-b, --debug Run the application in the Python Debugger (implies
nodaemon), sending SIGUSR2 will drop into debugger
-r, --reactor= Which reactor to use (see --help-reactors for a list of
possibilities)
--help Display this help and exit.
twistd reads a twisted.application.service.Application out of a file and runs
it.
Commands:
dns A domain name server.
ftp An FTP server.
inetd An inetd(8) replacement.
manhole-old An interactive remote debugger service.
portforward A simple port-forwarder.
socks A SOCKSv4 proxy service.
telnet A simple, telnet-based remote debugging service.
web A general-purpose web server which can serve from a
filesystem or application resource.
/usr/bin/twistd: Unknown command: irrigationcontroller
nailor@needle:/tmp/pba$
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.