Archiv der Kategorie: Raspberry Pi

[openhab] mail bei Bewegung

Neben dem Licht einschalten bei Bewegungserkennung kann mit entsprechender Regel auch eine E-Mail versendet werden.

Zunächst muss das Modul org.openhab.action.mail-*.jar in dem addons Verzeichnis abgelegt und openhab neu gestartet werden.
Zusätzlich müssen in der openhab.cfg der smtp Server und die entsprechenden Zugangsdaten hinterlegt werden.

Damit die Benachrichtigung deaktiviert werden können, wurde folgender Schalter in einer items Datei angelegt.
Switch BewegungInfoAbwesenheit "Bewegung Info Abwesenheit" (maschine) {OFF,ON}

Die Regel aus dem Artikel zur Bewegungserkennung wurde um folgende Zeilen erweitert:

if(BewegungInfoAbwesenheit.state == ON && Presence.state == OFF){
sendMail("E-Mail Adresse", "Betreff", "Nachricht")
}

[dashing] Informationen aus dem Icinga auf dem Dashboard

Neben den bisher genannten Möglichkeiten können auch Informationen per http aus anderen Systemen wie in diesem Beispiel Icinga geholt und dargestellt werden. Für das Abrufen der Daten wird hier nicht die Api verwendet, sondern der http Aufruf mit entsprechendem Parameter um ein Json Array zu erhalten.
Für den Zugriff auf die Icinga Daten wurde auf dem gleichen System ein weiteres Icinga-web2 angelegt. Der in der Konfiguratin hinterlegte Benutzer für den Datenbankzugriff, hat in diesem Fall nur lesende Rechte.

Damit die Authentifizierung über htpasswd und nicht über die Datenbank erfolgt, wurde die config/authentication.ini wie folgt angepasst:

[autologin]

backend = external

Neben der erwähnten Datei muss ebenfalls die vhost Konfig für den icingaweb2 angepasst werden.
DirectoryIndex error_norewrite.html
ErrorDocument 404 /error_norewrite.html
</IfModule>
AuthType Basic
AuthName "Icinga Web 2"
AuthUserFile /etc/icingaweb2/icingaweb.htpasswd
Require valid-user
</Directory>

Die benötigte Passworddatei wird mit htpasswd -c icingaweb.htpasswd dashing erstellt.

Dashboard

Die Dateien für das Widget werden unter dem Widgetsverzeichniss icinga abgelegt, die rb Datei in dem Verzeichniss job. Innerhalb der rb Datei muss die Url zum Icinga inklusive der Benutzerdaten angepasst werden. Die Url kann so konfiguriert werden, das zum Beispiel nur Alarme einer bestimmten Hostgruppe dargestellt werden.

icinga.coffee
class Dashing.Icinga extends Dashing.Widget
onData: (data) ->
if data.blink
node = $(@node)
node.addClass(„blinking“)
setTimeout ( =>
node.removeClass(„blinking“)
), 5000

icinga.scss

// —————————————————————————-
// Sass declarations
// —————————————————————————-
@keyframes blink {
50% { opacity : 0.0; }
}

$background-color: rgba(135, 135, 135, 0.7);
$title-color: rgba(255, 255, 255, 0.7);
$in-color: rgba(255, 255, 255, 1.0);
$out-color: rgba(175, 175, 175, 1.0);
$updated-at-color: rgba(255, 255, 255, 0.7);

.widget-icinga {
background-color: $background-color;

.content {
text-align: left;
padding-top:25px;
vertical-align: top;
}

.title {
color: $title-color;
position: absolute;
top: 18px;
left: 0;
right: 0;
}

.updated-at {
color: $updated-at-color;
}

&.large h3 {
font-size: 45px;
}

li {
font-size: 15px;
margin-top: 8px;
text-indent: 10px;
font-weight: normal;
}

.host {
font-weight: bold;
width:50%;
float:left;
}

.CRITICAL {
font-weight:bold;
float:left;
text-align:right;
width:50%;
color:#ff0022;
}

.OK {
font-weight:bold;
float:left;
text-align:right;
width:50%;
color:#3bdb22;
}

.WARNING {
font-weight:bold;
float:left;
text-align:right;
width:50%;
color:#ffde00;
}

.UNKNOWN {
font-weight:bold;
float:left;
text-align:right;
width:50%;
color:#ffffff;
}

.what {
font-style:italic;
font-size:10px;
font-weight: normal;
}

&.blinking {
animation: blink 1s linear infinite;
animation-iteration-count: 2;
}
}

icinga.html
<h1 class=“title“ data-bind=“title“></h1>
<div class=“content“>
<ul>
<li data-foreach-value=“values“ data-bind-class=“value.status“>
<i data-bind-class=“value.icon“></i>
<span class=“host“ data-bind=“value.host“></span>
<span data-bind-class=“value.alert“ data-bind=“value.alert“></span>
<span class=“what“ data-bind=“value.what“></span>
</li>
</ul>
</div>
<p class=“updated-at“ data-bind=“updatedAtMessage“></p>

icinga.rb

# job um werte aus dem Icinga zu holen

require ’net/http‘
require ‚uri‘
require ‚json‘
require „addressable/uri“

review_content_hash = 0
SCHEDULER.every ’30s‘ do
#service status
uri = Addressable::URI.parse(„http://localhost/icingaweb2/monitoring/list/services?(hostgroup=web1|host=miranda)&service_state!=0&service_unhandled=1&sort=service_severity&format=json“)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
request.basic_auth(„dashing“, „passwd“)
response = http.request(request)
#host status
uriH = Addressable::URI.parse(„http://localhost/icingaweb2/monitoring/list/hosts?(hostgroup=web1|host=miranda)&host_state!=0&sort=service_severity&format=json“)
httpH = Net::HTTP.new(uriH.host, uriH.port)
requestH = Net::HTTP::Get.new(uriH.request_uri)
requestH.basic_auth(„dashing“, „passwd“)
responseH = httpH.request(requestH)
werteH = JSON.parse(responseH.body)

review_content = {}

# Liste der Hosts erstellen
hosts = []
werteH.length.times do |idx|
if werteH[idx][„host_state“].to_i != 0
dalert = „DOWN“
end

review_content[idx] = {:host => werteH[idx][„host_name“],:alert => dalert}
#Host der liste hinzufügen
hosts.push(werteH[idx][„host_name“])
end

laenge = review_content.length

werte = JSON.parse(response.body)

werte.length.times do |idx|

# wenn es keine hostdown Meldung gibt dann wird der Servicealarm ausgegeben
if hosts.include?(werte[idx][„host_name“]) == false

if werte[idx][„service_state“].to_i == 0
dalert = „OK“
end

if werte[idx][„service_state“].to_i == 1
dalert = „WARNING“
end

if werte[idx][„service_state“].to_i == 2
dalert = „CRITICAL“
end

if werte[idx][„service_state“].to_i == 3
dalert = „UNKNOWN“
end
laenge += 1
review_content[laenge] = {:host => werte[idx][„host_name“],:what => werte[idx][„service_description“],:alert => dalert}
end
end

if review_content_hash == review_content.to_set.hash
send_event(„icappl“,{ values: review_content.values })
else
send_event(„icappl“,{ values: review_content.values, blink: review_content.length })
end
review_content_hash = review_content.to_set.hash

# ende scheduler
end

 

dashing-icinga

[openhab] FS20 Bewegungsmelder

Manchmal ist es nicht nur hilfreich das Licht einzuschalten wenn es dunkel wird und jemand zu Hause ist, sondern wenn es dunkel ist und eine Bewegung erkannt wird.

Da ich bereits FS20 Geräte im Einsatz habe, habe ich mir für die Bewegungserkennung den FS20 Funk-Bewegungsmelder zugelegt. Für das einbinden neuer Geräte hatte ich im Vorfeld den Artikel https://www.itbasic.de/openhab-fs20-fernbedienung-und-switch-status-aktualisierung/ geschrieben.

Registriert der Bewegungsmelder eine Bewegung soll ein Aktor, in diesem Fall eine FS20 Steckdose, geschaltet werden.
In der entsprechenden items Datei wurde nun der Aktor, der Bewegungsmelder und ein weiterer Schalter angelegt

items Datei
Switch LampeOb "Flur Stehlampe" (flur) {fs20="010101"}
Switch Beweg1 "Bewegungssensor 1" (fs) {fs20="000000"}
Switch FlurBewegung1 "Bewegungsmelder auto" (flur) {ON,OFF}

Der Schalter FlurBewegung1 dient dazu das Automatische schalten zu deaktivieren, so das der Aktor dauerhaft geschaltet werden kann.

rules Datei
rule Bewegung1
when
Item Beweg1 received update
then
if(FlurBewegung1.state == ON && LampeOb.state == OFF){
sendCommand(LampeOb, ON)
}
end

Wurde die LampeOb eingeschaltet und der Schalter FlurBewegung1 steht auf ON, wird die Lampe nach 360 Sekunden wieder ausgeschaltet.

rule LampeObBewegung
when
Item LampeOb received command ON
then
if(FlurBewegung1.state == ON){
timer = createTimer(now.plusSeconds(360)) [
sendCommand(LampeOb, OFF)
]
}
end

[dashing] Wetter Widget

Auf der Suche nach einem Wetter Widget für das Dashboard bin ich auf das Verbinski Widget gestoßen.

Das Widget benötigt 3 Kacheln und zeigt das Wetter im Moment, das heutige und 7 Tage im voraus an. Neben normalen Wetterdaten wird unter anderem der Zeitpunkt des Sonnenaufgangs bzw. Sonnenuntergangs angegeben, sowie Windgeschwindigkeit und Feuchtigkeit.

Die Wetterdaten werden über http://forecast.io/ abgerufen. Für den Zugriff auf die Daten wird ein API KEY benötigt, diesen erhält man nach kostenloser Registrierung.
Der API KEY sowie die LAT LONG Informationen werden in der verbinski.rb hinterlegt.

# Forecast API Key from https://developer.forecast.io
forecast_api_key = "82827928342934729387492837492374"

# Latitude, Longitude for location
forecast_location_lat = "53.167075"
forecast_location_long = "8.199514"

Auf Deutsch umstellen

Möchte man alle Informationen auf Deutsch darstellen, müssen kleinere Anpassungen in der verbinski.html Datei vorgenommen werden. Für die Wochentage unter „this week“ wurde eine Funktion in der verbinski.rb wie folgt angepasst:

this_week = []
for day in (1..7)
day = forecast["daily"]["data"][day]
tagGer = "tes"
if day_to_str(day["time"]) == "Sun"
tagGer = "Son"
elsif day_to_str(day["time"]) == "Mon"
tagGer = "Mon"
elsif day_to_str(day["time"]) == "Tue"
tagGer = "Die"
elsif day_to_str(day["time"]) == "Wed"
tagGer = "Mit"
elsif day_to_str(day["time"]) == "Thu"
tagGer = "Don"
elsif day_to_str(day["time"]) == "Fri"
tagGer = "Frei"
elsif day_to_str(day["time"]) == "Sat"
tagGer = "Sam"
end
this_day = {
max_temp: day["temperatureMax"].round,
min_temp: day["temperatureMin"].round,
time: tagGer,
icon: day["icon"]
}
this_week.push(this_day)

Um nun die Wetterinformationen in deutscher Sprache zu erhalten, muss der Zeile 34 (verbinski.rb) &lang=de hinzugefügt werden.

....ng}?units=#{forecast_units}&lang=de"))

verbinski Wetter Widget

[dashing] Ausgabe auf einem großen Fernseher

Wenn das erstellte Dashboard auf einem größeren Bildschirm ausgegeben wird, kann es je nach Anzahl der Widgets vorkommen, das nicht die gesamte Bildschirmfläche genutzt wird.

Das Problem lässt sich sehr schnell lösen, in dem man in der Dashboard(erb)Datei folgendes hinzufügt.

<script type='text/javascript'>

$(function() {

Dashing.widget_base_dimensions = [370, 340]

Dashing.numColumns = 5

});
<script>

Die Lösung hatte ich hier gefunden: https://github.com/Shopify/dashing/issues/388